<?php
/**
 * 正则验证类
 * 
 * CheckRegex   $param     需要验证的值
 *              $regextype 验证类型
 */
namespace Org\Util;
class Regexp {
    /**
    * 验证真实姓名
    */
    public static $realname = '/^[A-Za-z0-9\\u4e00-\\u9fa5]+$/';
    /**
    * 浮点数
    */
    public static $decmal = "/^([+-]?)\\d*\\.\\d+$/";
    /**
    * 正浮点数
    */
    public static $decmal1 = "/^[1-9]\\d*.\\d*|0.\\d*[1-9]\\d*$/";
    /**
    * 负浮点数
    */
    public static $decmal2 = "/^-([1-9]\\d*.\\d*|0.\\d*[1-9]\\d*)$/";
    /**
    * 浮点数
    */
    public static $decmal3 = "/^-?([1-9]\\d*.\\d*|0.\\d*[1-9]\\d*|0?.0+|0)$/";
    /**
    * 非负浮点数（正浮点数 + 0）
    */
    public static $decmal4 = "/^[1-9]\\d*.\\d*|0.\\d*[1-9]\\d*|0?.0+|0$";
    /**
    * 非正浮点数（负浮点数 + 0）
    */
    public static $decmal5 = "/^(-([1-9]\\d*.\\d*|0.\\d*[1-9]\\d*))|0?.0+|0$/";
    /**
    * 整数
    */
    public static $integer = "/^-?[1-9]\\d*$/";
    /**
    * 正整数
    */
    public static $intege1 = "/^[1-9]\\d*$/";
    /*
    * 负整数
    */
    public static $intege2 = "/^-[1-9]\\d*$/";
    /**
    * 数字
    */
    public static $number = "/^([+-]?)\\d*\\.?\\d+$/";
    /**
    * 正数（正整数 + 0）
    */
    public static $num1 = "/^[1-9]\\d*|0$/";
    /**
    * 负数（负整数 + 0）
    */
    public static $num2 = "/^-[1-9]\\d*|0$/";
    /**
    * 仅ACSII字符
    */
    public static $ascii = "/^[\\x00-\\xFF]+$/";
    /**
    * 仅中文
    */
    public static $chinese = "/^[\x80-\xff]+$/";///^[\\u4e00-\\u9fa5]+$/
    /**
    * 颜色
    */
    public static $color = "/^[a-fA-F0-9]{6}$/";
    /**
    * 日期
     * "/^\\d{4}(\\-|\\/|\.)\\d{1,2}\\1\\d{1,2}$/";
    */
    public static $date = "/^[0-9]{4}(\-|\/)[0-9]{1,2}(\\1)[0-9]{1,2}(|\s+[0-9]{1,2}(|:[0-9]{1,2}(|:[0-9]{1,2})))$/";
    /**
    * 邮件
    */
    public static $email = "/^\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+$/";
    /**
    * 身份证
    */
    public static $idcard = "/^[1-9]([0-9]{14}|[0-9]{17})$/";
    /**
    * ip地址
    */
    public static $ip = "/^(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)$/";
    /**
    * 字母
    */
    public static $english = "/^[A-Za-z]+$/";
    /**
    * 小写字母
    */
    public static $letter_l = "/^[a-z]+$/";
    /**
    * 大写字母
    */
    public static $letter_u = "/^[A-Z]+$/";
    /**
    * 手机
    */
    public static $mobile = '/(13|15|18)[0-9]{9}$/';
    /**
    * 电话号
    */
    public static $phone = "/(^(86)\-(0\d{2,3})\-(\d{7,8})\-(\d{1,4})$)|(^0(\d{2,3})\-(\d{7,8})$)|(^0(\d{2,3})\-(\d{7,8})\-(\d{1,4})$)|(^(86)\-(\d{3,4})\-(\d{7,8})$)/";
    /**
    * 非空
    */
    public static $notempty = "/^\\S+$/";
    /**
    * 密码
    */
    public static $usePsw = "/^[A-Za-z0-9_-]+$/";
    /**
    * 图片
    */
    public static $picture = "(.*)\\.(jpg|bmp|gif|ico|pcx|jpeg|tif|png|raw|tga)$/";
    /**
    * QQ号码
    */
    public static $qq = "/^[1-9]*[1-9][0-9]*$/";
    /**
    * 压缩文件
    */
    public static $rar = "(.*)\\.(rar|zip|7zip|tgz)$/";
    /**
    * url
    */
    public static $url = "^http[s]? = \\/\\/([\\w-]+\\.)+[\\w-]+([\\w-./?%&=]*)?$/";
    /**
    * 用户名
    */
    public static $userName = "/^[A-Za-z0-9_\\-\x80-\xff]+$/";///^[A-Za-z0-9_\\-\\u4e00-\\u9fa5]+$/
    /**
    * 邮编
    */
    public static $zipcode = "/^\\d{6}$/";
    /**
     * 验证是否有中文
     */
    public static $zhongwen = '/[\x80-\xff]+/';
    public $errmsg = array(
                            "realname"=>"请填写您的真实姓名",
                            "decmal"=>"请填写正确的浮点数",
                            "decmal1"=>"请填写正确的正浮点数",
                            "decmal2"=>"请填写正确的负浮点数",
                            "decmal3"=>"请填写正确的浮点数",
                            "decmal4"=>"请填写正确的非负浮点数（正浮点数 + 0）",
                            "decmal5"=>"请填写正确的非正浮点数（负浮点数 + 0）",
                            "integer"=>"请填写正确的整数",
                            "intege1"=>"请填写正确的正整数",
                            "intege2"=>"请填写正确的负整数",
                            "number"=>"请填写正确的数字",
                            "num1"=>"请填写正确的正数（正整数 + 0）",
                            "num2"=>"请填写正确的负数（负整数 + 0）",
                            "ascii"=>"请填写正确的ACSII字符",
                            "chinese"=>"请填写正确的中文",
                            "color"=>"请填写正确格式的颜色值",
                            "date"=>"请填写正确格式的日期",
                            "email"=>"请填写正确格式的邮箱地址",
                            "idcard"=>"请填写正确格式的身份证号码",
                            "ip"=>"请填写正确格式的ip地址",
                            "english "=>"请填写正确的字母",
                            "letter_l"=>"请填写正确的小写字母",
                            "letter_u"=>"请填写正确的大写字母",
                            "mobile "=>"请填写正确格式的手机号码",
                            "phone"=>"请填写正确格式的电话号码",
                            "notempty"=>"该字段不能为空",
                            "usePsw"=>"密码格式错误",
                            "picture"=>"请填写正确的图片地址",
                            "qq"=>"请填写正确格式的QQ号码",
                            "rar"=>"请填写正确的压缩文件地址",
                            "url"=>"请填写正确格式的url",
                            "userName"=>"用户名非法",
                            "zipcode"=>"请填写正确格式的邮编号码"
                    );
    /**
   * @param     string  $param     需要验证的值
   * @param	 string  $regextype 验证类型
   * 验证真实姓名 realname
   * 浮点数 decmal
   * 正浮点数 decmal1
   * 负浮点数 decmal2
   * 浮点数 decmal3
   * 非负浮点数（正浮点数 + 0） decmal4
   * 非正浮点数（负浮点数 + 0） decmal5
   * 整数 integer
   * 正整数 intege1
   * 负整数 intege2
   * 数字 number
   * 正数（正整数 + 0） num1
   * 负数（负整数 + 0） num2
   * 仅ACSII字符 ascii
   * 仅中文 chinese
   * 颜色 color
   * 日期 date
   * 邮件 email
   * 身份证 idcard
   * ip地址 ip
   * 字母 english 
   * 小写字母 letter_l
   * 大写字母 letter_u
   * 手机 mobile 
   * 电话号 phone
   * 非空 notempty
   * 密码 usePsw
   * 图片 picture
   * QQ号码 qq
   * 压缩文件 rar
   * url url
   * 用户名 userName
   * 邮编 zipcode
   * 
   * @return boolean 验证通过返回 true 否则返回 false
   */
    function CheckRegex($param,$regextype) {
        if($regextype == 'limit3_50'){
            if(self::length($param, '3,50')){
                return true;
            }else{
                return false;
            }
        }else{
            if(preg_match(self::$$regextype,$param)){
                return true;
            }else{
                return false;
            }
        }
        //echo self::$$regextype;
    }
    
    /**
     * 验证数据的值的长度是否在一定的范围内
     * @param string $value     需要验证的值
     * @param string $rules     一个范围，例如 3-20(3-20之间)、3,20(3-20之间)、3(必须是3个)、3,(3个以上)
     * @return boolean          验证通过返回 true 否则返回 false
     * 
     */
    static function length($value, $rules) {
            $fg=strstr($rules, '-') ? "-" : ",";
            
            if(!strstr($rules, $fg)){
                    if(strlen($value) != $rules){
                            return false;
                    }
            }else{
                list($min, $max)=explode($fg, $rules);

                if(empty($max)){
                        if(strlen($value) < $rules){
                            return false;
                        }
                }else if(!(strlen($value)>=$min && strlen($value) <=$max) ){
                        return false;
                }
            }
        return true;    
    }
}